#include <iostream>
#include <cstring>
using namespace std;
const int N=6*1e3+10;


int h[N],ne[N],to[N],idx;
int w[N];
int din[N];
int n;
int dp[N][2];
int ret;

void add(int x,int y)
{
	ne[idx]=h[x];
	to[idx]=y;
	h[x]=idx++;
}
void dfs(int u)
{
	dp[u][1]=w[u];
	for(int i=h[u];i!=-1;i=ne[i])
	{
		dfs(to[i]);
		dp[u][0]+=max(dp[to[i]][1],dp[to[i]][0]);
		dp[u][1]+=dp[to[i]][0];
	}
}
int main()
{
	memset(h,-1,sizeof(h));
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i];
	}
	
	for(int i=1;i<n;i++)
	{
		int a,b;
		scanf("%d%d",&a,&b);
		add(b,a);
		din[a]++;
	}
	int root=-1;
	for(int i=1;i<=n;i++)
	{
		if(din[i]==0)
			root=i;
	}

	dfs(root);
	cout<<max(dp[root][0],dp[root][1]);
	return 0;
}
